using CommunityToolkit.Maui;
using Microsoft.Extensions.Logging;
using RadioTimer.Services;
using RadioTimer.ViewModels;
using RadioTimer.Views;

namespace RadioTimer
{
    /// <summary>
    /// MAUI应用程序的主程序类
    /// 负责配置和初始化MAUI应用程序，包括依赖注入、服务注册和应用配置
    /// 采用构建者模式配置应用程序，实现松耦合的架构设计
    /// </summary>
    public static class MauiProgram
    {
        /// <summary>
        /// 创建和配置MauiApp实例
        /// 该方法是MAUI应用程序的入口点，负责配置所有必要的服务和组件
        /// </summary>
        /// <returns>配置完成的MauiApp实例</returns>
        public static MauiApp CreateMauiApp()
        {
            var builder = MauiApp.CreateBuilder();
            
            // 配置基本MAUI应用程序设置
            builder
                .UseMauiApp<App>()
                .ConfigureFonts(fonts =>
                {
                    // 注册默认字体
                    fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                    fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
                })
                .UseMauiCommunityToolkit();

            #region 服务注册
            
            // 注册数据和业务服务（单例模式）
            // 这些服务在整个应用程序生命周期中保持唯一实例
            builder.Services.AddSingleton<IDataStorageService, DataStorageService>();
            builder.Services.AddSingleton<ITextToSpeechService, TextToSpeechService>();
            builder.Services.AddSingleton<ITimeChimeService, TimeChimeService>();
            builder.Services.AddSingleton<IForegroundService, ForegroundServicePlatform>();
            builder.Services.AddSingleton<ILogService, LogService>();

            // 注册ViewModels（瞬时模式）
            // 每次请求时都创建新的实例，避免状态共享问题
            builder.Services.AddSingleton<MainPageViewModel>();
            builder.Services.AddSingleton<SettingsPageViewModel>();
            builder.Services.AddSingleton<LogPageViewModel>();

            // 注册视图页面（瞬时模式）
            // 每次导航时都创建新的页面实例，符合MAUI的页面生命周期管理
            builder.Services.AddSingleton<HomePage>();
            builder.Services.AddSingleton<SettingsPage>();
            builder.Services.AddSingleton<LogPage>();
            // MainPage 不再作为启动页使用，改为使用 AppShell
            
            #endregion

            #region 开发环境配置
            
#if DEBUG
            // 配置日志级别：只打印错误及以上级别的日志
            // 用于减少日志输出，仅显示错误和严重问题
            builder.Logging.AddDebug();
            builder.Logging.SetMinimumLevel(LogLevel.Error);
#endif
            
            #endregion

            // 构建并返回配置完成的MauiApp实例
            return builder.Build();
        }
    }
}